from flask import Flask, render_template, request, Response, stream_with_context, session
import requests
import json
from config import DEEPSEEK_API_KEY

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用于加密 session 数据

DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions'
SYSTEM_PROMPT = """
**身份:** 你是一位 AI 学习辅导老师 

**主要职责:** 

* [根据学生需求] -> 提供个性化学习计划
* [讲解概念] 
* [辅导解决作业问题] 
* [设计互动学习活动] 
* [保持鼓励态度]

**指导原则:**

1.  [专注于] -> 学术主题和常识
2.  [避免讨论] -> 敏感或不适当的话题
3.  [保持] -> 简洁清晰的表达
4.  [联系] -> 学习内容与实际生活
5.  [调整教学] -> 根据学生进度和兴趣

**回应策略:**

* [判断学生目标] -> 
    * [学习概念] -> 执行 **学习计划路径**
    * [作业问题] -> 执行 **作业辅导计划**

**学习计划路径:**

1.  [推断] -> 学习目标
2.  [制定] -> 分步学习计划
3.  [讲解] -> 主题、例子、趣味知识
4.  [进行] -> 互动学习活动
5.  [评估] -> 理解并提供反馈
6.  [总结/进行] -> 下一主题

**作业辅导计划:**

1.  [推断] -> 作业目标
2.  [简单问题] -> 直接答复
3.  [概念问题] -> 引导而非完整答案
4.  [数学问题] ->  第一步 + 引导思考
5.  [提供] -> 类似练习题巩固学习

**回答建议:**

* [控制] -> 回答长度
* [必要时] -> 分块发送 + 说明总共几部分
* [后续回答开头] -> 注明当前部分
* [主动提醒] -> 学习进度、上下文、之前内容总结"""

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/chat', methods=['POST'])
def chat():
    user_message = request.json['message']
    
    # 如果 session 中没有对话历史，初始化
    if 'conversation_history' not in session:
        session['conversation_history'] = [{'role': 'system', 'content': SYSTEM_PROMPT}]
    
    # 将用户的消息添加到对话历史中
    session['conversation_history'].append({'role': 'user', 'content': user_message})
    
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {DEEPSEEK_API_KEY}'
    }
    
    data = {
        'model': 'deepseek-chat',
        'messages': session['conversation_history'],  # 使用对话历史
        'stream': True
    }
    
    def generate():
        try:
            response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data, stream=True)
            response.raise_for_status()
            for line in response.iter_lines():
                if line:
                    line = line.decode('utf-8')
                    if line.startswith('data: '):
                        json_data = json.loads(line[6:])
                        if json_data['choices'][0]['finish_reason'] is not None:
                            break
                        content = json_data['choices'][0]['delta'].get('content', '')
                        if content:
                            # 将 AI 的回复添加到对话历史中
                            session['conversation_history'].append({'role': 'assistant', 'content': content})
                            yield f"data: {json.dumps({'content': content})}\n\n"
        except requests.exceptions.RequestException as e:
            print(f"API request failed: {e}")
            yield f"data: {json.dumps({'content': '抱歉,我现在无法回答。请稍后再试。'})}\n\n"
    
    return Response(stream_with_context(generate()), content_type='text/event-stream')

@app.route('/clear_context', methods=['POST'])
def clear_context():
    session.pop('conversation_history', None)  # 清空对话历史
    return {'message': '对话上下文已清除'}

if __name__ == '__main__':
    app.run(debug=True, port=9999)